<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>C语言基础 - 指针基础</title>
    <link rel="stylesheet" href="common.css">
    <style>
        /* 页面特有样式 */
        .pointer-card {
            background-color: #f5f9ff;
            border-radius: 8px;
            padding: 20px;
            margin-bottom: 25px;
            border-left: 4px solid #5D9CEC;
        }
        
        .concept-box {
            background-color: #f0f7ff;
            padding: 15px;
            border-radius: 5px;
            margin: 15px 0;
        }
        
        .operator-box {
            background-color: #fff3e0;
            padding: 15px;
            border-radius: 5px;
            margin: 15px 0;
        }
        
        .arithmetic-box {
            background-color: #e8f5e9;
            padding: 15px;
            border-radius: 5px;
            margin: 15px 0;
        }
        
        .memory-diagram {
            background-color: #f8f8f8;
            padding: 15px;
            border-radius: 5px;
            font-family: monospace;
            margin: 15px 0;
        }
        
        .warning-note {
            background-color: #ffebee;
            border-left: 4px solid #f44336;
            padding: 12px;
            margin: 15px 0;
        }
    </style>
</head>
<body>
    <div class="container">
        <header>
            <h1>C语言基础入门课程</h1>
        </header>
        
        <nav>
            <a href="index.html">首页</a>
            <a href="02-intro.html">C语言简介与环境搭建</a>
            <a href="03-structure.html" class="current">C程序结构</a>
            <a href="04-datatypes.html">基本数据类型</a>
            <a href="05-variables.html">变量与常量</a>
            <a href="06-operators.html">运算符</a>
            <a href="07-io.html" class="current">输入输出</a>
            <a href="08-conditionals.html">条件语句</a>
            <a href="09-loops.html">循环结构</a>
            <a href="10-functions.html" class="current">函数基础</a>
            <a href="11-scope.html">作用域与存储类</a>
            <a href="12-recursion.html">递归函数</a>
            <a href="13-arrays.html">一维数组</a>
            <a href="14-multidim.html" class="current">多维数组</a>
            <a href="15-strings.html">字符串处理</a>
            <a href="16-pointers.html">指针基础</a>
            <a href="17-pointers_advanced.html" class="current">指针进阶</a>
            <a href="18-structs.html">结构体</a>
            <a href="19-files.html">文件操作</a>
            <a href="20-project.html">综合项目</a>
        </nav>
        
        <main>
            <h2>C语言指针基础</h2>
            
            <section>
                <h3>指针概述</h3>
                <p>指针是存储内存地址的变量，是C语言强大功能的核心。</p>
            </section>
            
            <div class="pointer-card">
                <h3>1. 指针概念</h3>
                
                <div class="concept-box">
                    <h4>指针的定义</h4>
                    <pre><code>数据类型 *指针变量名;</code></pre>
                    <p>例如：<code>int *ptr;</code> 定义一个指向整型的指针</p>
                    
                    <h4>指针的大小</h4>
                    <p>所有数据类型的指针大小相同，取决于系统架构：</p>
                    <pre><code>printf("指针大小: %zu字节\n", sizeof(int*));
// 32位系统通常为4字节，64位系统通常为8字节</code></pre>
                </div>
                
                <div class="memory-diagram">
                    <h4>指针与内存关系示意图</h4>
                    <pre>
变量       地址        值
num     0x7ffd1234   42
         ↓
ptr → 0x7ffd1234
                    </pre>
                    <p>指针变量存储的是另一个变量的内存地址</p>
                </div>
                
                <div class="warning-note">
                    <h4>注意事项</h4>
                    <ul>
                        <li>指针声明后应先初始化再使用</li>
                        <li>未初始化的指针是"野指针"，使用会导致未定义行为</li>
                        <li>指针类型应与指向的数据类型匹配</li>
                    </ul>
                </div>
            </div>
            
            <div class="pointer-card">
                <h3>2. 指针运算符</h3>
                
                <div class="operator-box">
                    <h4>取地址运算符 &amp;</h4>
                    <p>获取变量的内存地址</p>
                    <pre><code>int num = 42;
int *ptr = &amp;num;  // ptr现在存储num的地址</code></pre>
                </div>
                
                <div class="operator-box">
                    <h4>解引用运算符 *</h4>
                    <p>访问指针指向的内存内容</p>
                    <pre><code>int num = 42;
int *ptr = &amp;num;
printf("%d", *ptr);  // 输出42，通过指针访问num的值

*ptr = 100;  // 通过指针修改num的值
printf("%d", num);  // 输出100</code></pre>
                </div>
                
                <div class="memory-diagram">
                    <h4>运算符使用示例</h4>
                    <pre>
int num = 42;       // num = 42
int *ptr = &amp;num;    // ptr = 地址of num
*ptr = 100;         // num = 100
                    </pre>
                </div>
            </div>
            
            <div class="pointer-card">
                <h3>3. 指针算术</h3>
                
                <div class="arithmetic-box">
                    <h4>基本算术运算</h4>
                    <p>指针支持有限的算术运算：++、--、+、-</p>
                    <pre><code>int arr[] = {10, 20, 30, 40, 50};
int *ptr = arr;  // 指向数组第一个元素

printf("%d\n", *ptr);  // 10
ptr++;  // 移动到下一个元素
printf("%d\n", *ptr);  // 20
ptr += 2;  // 向前移动2个元素
printf("%d\n", *ptr);  // 40
ptr--;  // 向后移动1个元素
printf("%d\n", *ptr);  // 30</code></pre>
                </div>
                
                <div class="arithmetic-box">
                    <h4>指针减法</h4>
                    <p>计算两个指针之间的距离(元素个数)</p>
                    <pre><code>int arr[] = {10, 20, 30, 40, 50};
int *ptr1 = &amp;arr[1];  // 指向20
int *ptr2 = &amp;arr[4];  // 指向50

int distance = ptr2 - ptr1;  // 结果为3
printf("元素个数: %d\n", distance);</code></pre>
                </div>
                
                <div class="warning-note">
                    <h4>重要规则</h4>
                    <ul>
                        <li>指针加减整数n，实际移动n*sizeof(类型)字节</li>
                        <li>同类型指针才能相减</li>
                        <li>指针不能相加</li>
                        <li>指针比较只适用于同一数组/对象的元素</li>
                    </ul>
                </div>
                
                <div class="memory-diagram">
                    <h4>指针算术示意图</h4>
                    <pre>
arr[0] arr[1] arr[2] arr[3] arr[4]
  ↓     ↓       ↓       ↓      ↓
 [10]  [20]    [30]    [40]   [50]
  ↑           ↑
ptr1        ptr2
                    </pre>
                    <p>ptr2 - ptr1 = 2 (元素间隔)</p>
                </div>
            </div>
            
            <section>
                <h3>综合示例</h3>
                <pre><code>#include &lt;stdio.h&gt;

int main() {
    // 基本指针使用
    int num = 42;
    int *ptr = &amp;num;
    
    printf("num的值: %d\n", num);
    printf("num的地址: %p\n", &amp;num);
    printf("ptr存储的地址: %p\n", ptr);
    printf("ptr指向的值: %d\n", *ptr);
    
    // 通过指针修改值
    *ptr = 100;
    printf("修改后num的值: %d\n", num);
    
    // 指针算术
    int arr[] = {10, 20, 30, 40, 50};
    int *arrPtr = arr;  // 等价于 &amp;arr[0]
    
    printf("\n数组元素:");
    for (int i = 0; i < 5; i++) {
        printf(" %d", *(arrPtr + i));  // 等价于arrPtr[i]
    }
    
    // 指针减法
    int *start = &amp;arr[0];
    int *end = &amp;arr[4];
    printf("\n数组元素个数: %ld\n", end - start + 1);
    
    return 0;
}</code></pre>
            </section>
        </main>
        
        <footer>
             <p>&copy; </p>
        </footer>
        
        <!-- 二维码区域 -->

    </div> <!-- 结束.container -->
</body>
</html>